#include "shell_analyse.h"

    //将一串字符输入分解为字符串，按顺序存入List中。List中的每个字符串都代表需要执行的命令及其参数。
QStringList SHELL_ANALYSE::analyse(QString str)
{
    QStringList CMD_LIST;
    //下面的输入代表信息的格式
    /*

    [
    函数名
    相关参数
    ]

    由于默认使用符号组合 [] 来判断输入的分界，所以，
    如果想要把符号 '['和 ']'作为参数，需要在符号前加入一个英文下斜杠 这样输入 _[ 和 _]

    以下代码将打印一个内容为[12345678]的条码，软件对参数位置不敏感
    [
    barcode
    x=0
    y=0
    type=128
    height=10
    show=1
    turn=0
    message=_[12345678_]
    ]

    我决定只提供有限的参数输入。设计太多用不上的功能只会令用户感到迷惑和烦躁。
    所以，就以上述的barcode命令为例，实际上barcode命令有9个参数，我只使用了5个参数：

    横向偏移
    纵向偏移
    条码高度（长度由内容和编码方式决定）
    条码信息
    是否附带明文

    其它的我不打算在脚本里实现。比如说条码的2个比例缩放因子，还有条码的编码方式,以及条码是否旋转。
    也许会把SHELL不涉及的参数做进软件的setting里面来手动控制。
    官方提供的编程手册非常瓜皮，甚至还有1个条码涉及3种格式的做法。我不打算把功能做得那么花，毕竟这是一个实用工具。
    */
    int head=0;
    int end=0;
    int flag;   //用于确认"head正在扫过命令"的标志位
    for(end=0;end<str.length();end++)
    {
        QString temp = "";  //初始化命令
        //开始截取
        if(str.at(end) == ']')//检查到一段命令的结尾
        {
            if( end-1 > 0 && str.at(end-1) == '_')//如果是打印内容，则什么都不做。
            {}
            else//如果不是，那么结尾就已经确定，开始移动头部
            {
                flag = false;
                for(;head<end;head++)
                {
                    if(flag == true)
                    {temp.append(str.at(head));}

                    if(flag == false && str.at(head) == '[')//检查到一段命令的结尾
                    {
                        if( head-1 > 0 && str.at(head-1) == '_')//如果是打印内容，则什么都不做。
                        {}
                        else
                        {flag = true;}
                    }
                }

                if(head == end)//当检索完一条指令，就存入指令列表
                {
                    CMD_LIST.insert(CMD_LIST.end(),temp);   //在命令列表末尾插入命令
                }

            }
        }
    }

    return CMD_LIST;
}
